< 37B61466-7840-4D34-8B3E-9B44AE39487D

ParentDataWidget のジェネリック タイプが ParentData に変更されました

まとめ

のジェネリックタイプParentDataWidgetから変わりましたRenderObjectWidgetParentData

コンテクスト

この変更の前は、ParentDataWidget縛られていた 特定のRenderObjectWidget祖先としてタイプします。 たとえば、Positionedウィジェットのみ使用可能 以内Stackウィジェット。この変更により、 あるParentDataWidgetどれでも使用できますRenderObjectWidget祖先として入力する のRenderObject言ったRenderObjectWidget正しい設定をするParentDataタイプ。この新しい世界で、 のPositionedウィジェットは仮説で再利用できます 新しいSuperStackウィジェット。

変更内容の説明

のジェネリック型引数ParentDataWidgetから変わりましたRenderObjectWidgetParentData、 そして新しいデバッグプロパティ、debugTypicalAncestorWidgetClass、 に追加されますParentDataWidget。 後者は、ユーザーに情報を提供するエラー メッセージに使用されます。 与えられたコンテキストのより良いアイデアParentDataWidgetで使用されることになっています。

移行ガイド

このセクションの説明に従ってコードを移行する必要があります サブクラス化または実装している場合ParentDataWidget。 これを行うと、アナライザーは次の警告を表示します。 この変更を含む Flutter バージョンにアップグレードします。

  error • Missing concrete implementation of 'getter ParentDataWidget.debugTypicalAncestorWidgetClass' • lib/main.dart:114:7 • non_abstract_class_inherits_abstract_member
  error • 'FrogJar' doesn't extend 'ParentData' • lib/main.dart:114:41 • type_argument_not_matching_bounds

移行前のコード:

class FrogSize extends ParentDataWidget<FrogJar> {
  FrogSize({
    Key key,
    required this.size,
    required Widget child,
  }) : assert(child != null),
        assert(size != null),
        super(key: key, child: child);

  final Size size;

  @override
  void applyParentData(RenderObject renderObject) {
    final FrogJarParentData parentData = renderObject.parentData;
    if (parentData.size != size) {
      parentData.size = size;
      final RenderFrogJar targetParent = renderObject.parent;
      targetParent.markNeedsLayout();
    }
  }
}

class FrogJarParentData extends ParentData {
  Size size;
}

class FrogJar extends RenderObjectWidget {
  // ...
}

移行後のコード:

class FrogSize extends ParentDataWidget<FrogJarParentData> { // FrogJar changed to FrogJarParentData
  FrogSize({
    Key key,
    required this.size,
    required Widget child,
  }) : assert(child != null),
        assert(size != null),
        super(key: key, child: child);

  final Size size;

  @override
  void applyParentData(RenderObject renderObject) {
    final FrogJarParentData parentData = renderObject.parentData;
    if (parentData.size != size) {
      parentData.size = size;
      final RenderFrogJar targetParent = renderObject.parent;
      targetParent.markNeedsLayout();
    }
  }

  @override
  Type get debugTypicalAncestorWidgetClass => FrogJar; // Newly added
}

のジェネリックタイプParentDataWidgetスーパークラス からの変更FrogJar(RenderObjectWidget) にFrogJarParentData(ParentDataそれをタイプしますFrogSize.applyParentDataを操作したいと考えています)。 さらに、新しいdebugTypicalAncestorWidgetClassこのために実装されているParentDataWidgetサブクラス。 典型的な祖先のタイプを返します。RenderObjectWidgetこのためParentDataWidget。ほとんどの時間、 ここでは古いジェネリック型を返したいだけです (FrogJarこの例では)。

タイムライン

リリースされたバージョン: 1.16.3
安定版リリース: 1.17

参考文献

API ドキュメント:

  • ParentDataWidget

関連する PR:

  • ParentDataWidget をさまざまな祖先 RenderObjectWidget タイプで使用できるようにする